Cloud DNSの限定公開のプライベートゾーンをTerraformで作成する

Cloud DNSの限定公開のプライベートゾーンをTerraformで作成する

Clock Icon2025.01.17

概要

Cloud DNSではGoogle Cloud内部でのみ名前解決できるプライベートゾーンを作成することができます。

https://dev.classmethod.jp/articles/20241030-clouddns-privatezone/

以前上記ブログで扱った時は解説も兼ねてGUIで操作して限定公開のプライベートゾーンを作成しました。
最近Terraformを扱うことが多くなってきたので、備忘録も兼ねて限定公開のプライベートゾーンをTerraformで作成する過程を記事にしてみました。

やってみる

今回Terraformで作成するリソースは以下となります。

  • 限定公開のプライベートゾーン
  • 限定公開のプライベートゾーンを適用するVPC
  • 限定公開のプライベートゾーンのAレコード

それでは作っていきます。

リファレンス

使用するTerraformのリソースとそのリソースのリファレンスを示します。

Resources 概要 リファレンス
google_dns_managed_zone ゾーンの作成用 google_dns_manage_zone
google_compute_network VPC作成用 google_compute_network
google_dns_record_set Aレコード設定用 google_dns_record_set

とりあえずリファレンスを読み込んでTerraformスクリプトを実装してみます。

Terraformスクリプト

何はともあれ実装したTerraformスクリプトを示します。その後解説していきます。

provider "google" {
  project = "Google CloudプロジェクトID"
  region  = "asia-northeast1" # 必要に応じて変更
}

# 限定公開ゾーンの作成
resource "google_dns_managed_zone" "private_zone" {
  name        = "example-private-zone"
  dns_name    = "example.local."
  description = "Private DNS Zone"

  visibility = "private" # 限定公開ゾーンを設定

  private_visibility_config {
    networks {
      network_url = google_compute_network.network-1.id
    }
  }
}

resource "google_compute_network" "network-1" {
  name                    = "network-1"
  auto_create_subnetworks = false
}

# Aレコードの作成
resource "google_dns_record_set" "a_record" {
  name         = "app.example.local." # レコード名
  type         = "A"                  # レコードタイプ(Aレコード)
  ttl          = 300                  # TTL(秒)
  managed_zone = google_dns_managed_zone.private_zone.name

  rrdatas = [
    "***.***.***.***", # 指定するIPv4アドレス
  ]
}

順番に解説します。


限定公開ゾーンの作成

resource "google_dns_managed_zone" "private_zone" {
  name        = "example-private-zone"
  dns_name    = "example.local."
  description = "Private DNS Zone"

  visibility = "private"

  private_visibility_config {
    networks {
      network_url = google_compute_network.network-1.id
    }
  }
}
  • resource "google_dns_managed_zone":

    • Cloud DNSのマネージドゾーンを作成するためのリソース
  • name:

    • ゾーンの名前を指定
  • dns_name:

    • ゾーンのDNS名(ドメイン名)を指定
  • description:

    • ゾーンの説明を記載
  • visibility:

    • ゾーンの公開範囲
    • "private" を指定することで、限定公開のプライベートゾーンとなる。指定したVPC内でのみ名前解決が可能
  • private_visibility_config:

    • 限定公開ゾーンを特定のVPCネットワークに関連付ける
    • networks:
      • このゾーンに関連付けるVPCネットワークを指定
      • 今回の例では、後述の google_compute_network.network-1 で作成されるVPCのIDを指定

VPCの作成

resource "google_compute_network" "network-1" {
  name                    = "network-1"
  auto_create_subnetworks = false
}
  • resource "google_compute_network":

    • VPCを作成するリソース
  • name:

    • VPC名を指定
  • auto_create_subnetworks:

    • サブネットの自動作成を有効または無効にするオプション
    • false を指定するとデフォルトのサブネットが自動的に作成されない

Aレコードの作成

resource "google_dns_record_set" "a_record" {
  name         = "app.example.local." # レコード名
  type         = "A"                  # レコードタイプ(Aレコード)
  ttl          = 300                  # TTL(秒)
  managed_zone = google_dns_managed_zone.private_zone.name

  rrdatas = [
    "***.***.***.***", # 指定するIPv4アドレス
  ]
}
  • resource "google_dns_record_set":

    • DNSレコードを作成するためのリソース
  • name:

    • 作成するDNSレコードの名前を指定
  • type:

    • レコードの種類を指定。Aレコードを作成したいのでAを指定
  • ttl:

    • レコードの有効期限(Time To Live)を秒単位で指定。今回は300秒(5分)を指定
  • managed_zone:

    • DNSレコードを作成する対象のDNSゾーンを指定
  • rrdatas:

    • このAレコードが指すIPアドレスを指定
    • (***.***.***.***は必要に応じて書き換える)

実行するとどうなるか

実行結果としては以下となります。

  1. VPCの作成:

    • network-1という名前のVPCが作成されます
  2. 限定公開のプライベートゾーンの作成:

    • example.local. という名前の限定公開のプライベートゾーンが作成されます
    • このゾーンは、指定したVPC(network-1)に関連付けているので、このVPC内でのみ名前解決が可能です
  3. Aレコードの作成:

    • app.example.local. という名前のAレコードが作成されます
    • 指定したIPv4アドレス(***.***.***.***)が設定されています

確認する

terraform applyをしたらリソースが作成されているのでコンソールから確認してみます。
まずは限定公開のプライベートゾーン
スクリーンショット 2025-01-17 1.41.08.png

種類がプライベートなので限定公開のプライベートゾーンとして作成されていることが確認できます。Aレコードにも指定したIPアドレスが指定されていました(マスクしています)

続いてVPCも確認します。
指定した名称でVPCが作成されており、サブネット作成モードがカスタムサブネットになっておりました。
スクリーンショット 2025-01-17 1.41.19.png

上記より、Terraformで作成したかった通りのリソースが作成できていることが確認できました。
Terraformはサクッとできて本当に心強いですね。万歳。

所感

google_dns_managed_zoneとgoogle_compute_networkのように、リソース間の依存関係を明示的に指定しなくても、Terraformが自動的に解決してくれる点は非常に便利だなと思います。
また、再現性の高さも嬉しいです。Terraformコードを使えば、同じ設定を別の環境やプロジェクトでも簡単に再現できることは手作業でのミスを防ぎ、インフラの構成を確実に再現できるなと考えます。

それではまた、ナマステー

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.